package com.zs;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * Description:
 *
 * @author: zsq-1186
 * Date: 2017-08-16-17:11
 */
public class MQConsumer {
    //队列名称
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) {
        // 实例化工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置相关参数,地址，端口，账号，密码
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        try {
            // 获取connection
            Connection conn = factory.newConnection();
            // 获取channel
            Channel channel = conn.createChannel();
            //声明要关注的队列 -- 在RabbitMQ中，队列声明是幂等性的（一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同），也就是说，如果不存在，就创建，如果存在，不会对已经存在的队列产生任何影响。
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            System.out.println(" [*]MQConsumer1 Waiting for messages. To exit press CTRL+C");
            //创建队列消费者
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                                           AMQP.BasicProperties properties, byte[] body)
                        throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println(" [x] Received '" + message + "'");
                    try {
                        doWork();
                    }finally {
                        // 消息处理完成确认 //消息的标识，false只确认当前一个消息收到，true确认所有consumer获得的消息
                        channel.basicAck(envelope.getDeliveryTag(),false);
                    }
                }
            };
            // 消息消费完成确认
            channel.basicConsume(QUEUE_NAME, true, consumer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void doWork(){
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
